package opgave1;

public class Verzameling implements VerzamelingInterface {

	private Identifier[] identifiers;
	private int amountOfElements;
	
	public Verzameling() {
		identifiers = new Identifier[MAXIMUM_SIZE];
		amountOfElements = 0;
	}
	
	public Verzameling(Verzameling src) {
		identifiers = new Identifier[MAXIMUM_SIZE];
		for (int i = 0; i < src.amountOfElements; i++) {
			identifiers[i] = new Identifier(src.identifiers[i]);
		}
		amountOfElements = src.amountOfElements;
	}
	
	public void init() {
		amountOfElements = 0;
	}

	public void add(Identifier ident) {
		if(!contains(ident)) {
			identifiers[amountOfElements] = new Identifier(ident);
			amountOfElements++;
		}
	}

	public Identifier take() {
		amountOfElements -= 1;
		return new Identifier(identifiers[amountOfElements]);
	}

	public int size() {
		return amountOfElements;
	}

	public boolean contains(Identifier ident) {
		for (int i = amountOfElements - 1; i >= 0; i--) {
			if (ident.equals(identifiers[i])) {
				return true;
			}
		}
		
		return false;
	}
	
	public Verzameling verschil(Verzameling verz2) {
		// Maakt een verzameling aan
		Verzameling resultaat = new Verzameling();
		// Maakt kopie van de verzameling 1 aan, waarvan de take gebruikt word.
		Verzameling kopie = new Verzameling(this);
		
		// Gaat voor elk element in deze verzameling kijken of deze in verzameling 2 zit
		for (int i = kopie.amountOfElements - 1; i >= 0; i--) {
			Identifier ident = kopie.take();
			if(!verz2.contains(ident)) {
				resultaat.add(ident);
			}
		}
		
		return resultaat;
	}

	public Verzameling doorsnede(Verzameling verz2) {
		// Maak een verzameling aan
		Verzameling resultaat = new Verzameling();
		// Maakt kopie van de verzameling 1 aan, waarvan de take gebruikt word.
		Verzameling kopie = new Verzameling(this);
		
		// Gaat voor elk element in deze verzameling
		for (int i = kopie.amountOfElements - 1; i >= 0; i--) {
			Identifier ident = kopie.take();
			if(verz2.contains(ident)) {
				resultaat.add(ident);
			}
		}
		
		return resultaat;
	}

	public Verzameling vereniging(Verzameling verz2) {
		// Maak een verzameling aan
		Verzameling resultaat = new Verzameling();

		// Maakt kopieen van de verzamelingen aan, waarvan de take gebruikt word.
		Verzameling kopie = new Verzameling(this);
		Verzameling verz2kopie = new Verzameling(verz2);
		
		for (int i = kopie.amountOfElements - 1; i >= 0; i--) {
			Identifier ident = kopie.take();
			resultaat.add(ident);
		}
		
		for (int i = verz2kopie.amountOfElements - 1; i >= 0; i--) {
			Identifier ident = verz2kopie.take();
			if(!resultaat.contains(ident)) {
				resultaat.add(ident);
			}
		}
		
		return resultaat;
	}

	public Verzameling symvers(Verzameling verz2) {
		// Maak een verzameling aan
		Verzameling resultaat = new Verzameling();
		
		// Maakt kopieen van de verzamelingen aan, waarvan de take gebruikt word.
		Verzameling kopie = new Verzameling(this);
		Verzameling verz2kopie = new Verzameling(verz2);
		
		for (int i = kopie.amountOfElements - 1; i >= 0; i--) {
			Identifier ident = kopie.take();
			if(!verz2kopie.contains(ident)) {
				resultaat.add(ident);
			}
		}
		
		for (int i = verz2kopie.amountOfElements - 1; i >= 0; i--) {
			Identifier ident = verz2kopie.take();
			if(!contains(ident)) {
				resultaat.add(ident);
			}
		}
		
		return resultaat;
	}
}
